package com.future.interview;

/**
 * Description: 学达科技（2022-7-1）
 * 有两个队伍要PK,龙队有a b c 三个队员对战虎队x y z三个队员，其中a说不能和y 对战，x说不能和a、b对战，请用算法写出这龙队和虎队各个队员对战的情况
 * @author weiruibai.vendor
 * Date: 2022/7/4 09:07
 */
// 算法数据结构体系学习班, 第18节：认识一些经典递归过程
// 课时156 ~ 课时166
// 看一下，这节课介绍了全排列的写法
public class ABCvsXYZ {

    // 不违反规则的情况下，
    // 打印ABC和XYX所有可能的对战情况
    public static void printAllVs() {
        System.out.println("所有合法的对战方案为 : ");
        process(new char[] { 'x', 'y', 'z' }, 0);
    }

    public static void process(char[] arr, int index) {
        if (index == arr.length) {
            if (rule(arr)) {
                System.out.print("a对战" + arr[0] + " , ");
                System.out.print("b对战" + arr[1] + " , ");
                System.out.print("c对战" + arr[2] + " ");
                System.out.println();
                System.out.println("======================");
            }
        } else {
            for (int i = index; i < arr.length; i++) {
                swap(arr, i, index);
                process(arr, index + 1);
                swap(arr, i, index);
            }
        }
    }

    // 规则 : a不能和y对战, a、b不能和x对战
    public static boolean rule(char[] arr) {
        return arr[0] != 'y' && arr[0] != 'x' && arr[1] != 'x';
    }

    public static void swap(char[] arr, int i, int j) {
        char tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

    public static void main(String[] args) {
        printAllVs();
    }

}
